home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Add-Ons / After Dark / Twist 1.0b1 / ADTwist.c < prev    next >
Text File  |  1996-07-05  |  9KB  |  416 lines

  1. /* ADTwist.c
  2.  * After Dark module that "twists" the screen pixels
  3.  * Copyright ©1996 Michael D. Crawford.  All Rights Reserved.
  4.  * You may use this code on the condition that you read the following web page:
  5.  * http://www.scruznet.com/~crawford/WordServices/wdsvindex.html
  6.  */
  7.  
  8. #include <QDOffscreen.h>
  9. #include "GraphicsModule_Types.h"
  10. #include "MessageHandlers.h"
  11. #include "FindBrowser.h"
  12.  
  13. #define kCannotFindBrowserID    128
  14. #define kMaxScreens    8
  15.  
  16. typedef struct{
  17.     short        curLine;
  18.     GWorldPtr    tempWorld;
  19.     GWorldPtr    oldScreen;
  20. }tScreenInfo, *tScreenInfoPtr, **tScreenInfoHdl;
  21.  
  22. typedef struct{
  23. //    short         curLine;
  24.     Boolean        firstDraw;
  25.     short        curMonitor;
  26. //    GWorldPtr    tempWorld;
  27. //    GWorldPtr    oldScreen;
  28.     tScreenInfoHdl    screenInfo[ kMaxScreens ];
  29. } tTwistInfo, *tTwistPtr, **tTwistHandle;
  30.  
  31. void CenterRect( Rect *toPtr, Rect *fromPtr, Rect *inPtr );
  32.  
  33. OSErr DoInitialize(Handle *storage, RgnHandle blankRgn, GMParamBlockPtr params)
  34. {
  35.     tTwistHandle    tHdl;
  36.     Rect            r;
  37.     GWorldPtr        tempWorld;
  38.     GWorldPtr        oldScreen;
  39.     GWorldPtr        curWorld;
  40.     GDHandle        curDev;
  41.     OSErr            err;
  42.     short            i;
  43.     
  44.     tHdl = (tTwistHandle)NewHandle( sizeof( tTwistInfo ) );
  45.     if ( !tHdl )
  46.         return MemError();
  47.         
  48.     *storage = (Handle)tHdl;
  49.     
  50.     (*tHdl)->firstDraw = true;
  51.  
  52.     GetGWorld( &curWorld, &curDev );
  53.         
  54.     for ( i = 0; i < params->monitors->monitorCount ; i++){
  55.         (*tHdl)->screenInfo[ i ] = (tScreenInfoHdl)NewHandle( sizeof( tScreenInfo ) );
  56.         if ( !(*tHdl)->screenInfo[ i ] )
  57.             return memFullErr;
  58.         
  59.         r = params->monitors->monitorList[ i ].bounds;
  60.     
  61.         err = NewGWorld( &oldScreen,
  62.                         params->monitors->monitorList[ i ].curDepth, 
  63.                         &r,
  64.                         (CTabHandle)NULL,
  65.                         (GDHandle)NULL,
  66.                         (GWorldFlags)0 );
  67.         
  68.         if ( err )
  69.             return err;
  70.             
  71.         (*(*tHdl)->screenInfo[ i ])->oldScreen = oldScreen;
  72.         
  73.         LockPixels( oldScreen->portPixMap );
  74.     
  75.         SetGWorld( oldScreen, curDev );
  76.     
  77.         CopyBits( ¶ms->qdGlobalsCopy->qdThePort->portBits,
  78.                     (BitMap*)*( oldScreen )->portPixMap,
  79.                     &r,
  80.                     &r, 
  81.                     srcCopy, 
  82.                     (RgnHandle)NULL );
  83.         
  84.         UnlockPixels( oldScreen->portPixMap );
  85.     
  86.         r.right = r.left + 1;
  87.     
  88.         (*(*tHdl)->screenInfo[ i ])->curLine = r.top;
  89.         
  90.         err = NewGWorld( &tempWorld,
  91.                         params->monitors->monitorList[ i ].curDepth, 
  92.                         &r,
  93.                         (CTabHandle)NULL,
  94.                         (GDHandle)NULL,
  95.                         (GWorldFlags)0 );
  96.         
  97.         if ( err )
  98.             return err;
  99.             
  100.         (*(*tHdl)->screenInfo[ i ])->tempWorld = tempWorld;
  101.         
  102.         LockPixels( tempWorld->portPixMap );
  103.         
  104.     }
  105.  
  106.     for ( ; i < kMaxScreens; i++ ){
  107.         (*tHdl)->screenInfo[ i ] = (tScreenInfoHdl)NULL;
  108.     
  109.     }
  110.  
  111.     SetGWorld( curWorld, curDev );
  112.  
  113.     return noErr;
  114. }
  115.  
  116. OSErr DoClose( Handle storage,RgnHandle blankRgn,GMParamBlockPtr params )
  117. {
  118.     tTwistHandle    tHdl;
  119.     short            i;
  120.  
  121.     tHdl = (tTwistHandle)storage;
  122.     
  123.     if ( !tHdl )
  124.         return noErr;
  125.     
  126.     for ( i = 0; i < kMaxScreens; i++ ){
  127.         if ( (*tHdl)->screenInfo[ i ] ){
  128.             if ( (*(*tHdl)->screenInfo[ i ])->tempWorld )
  129.                 DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->tempWorld );
  130.             if ( (*(*tHdl)->screenInfo[ i ])->oldScreen )
  131.                 DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->oldScreen );
  132.         }
  133.     }
  134.     
  135.     DisposeHandle( (Handle)tHdl );
  136.     
  137.     return noErr;
  138. }
  139.  
  140. OSErr DoBlank(Handle storage, RgnHandle blankRgn, GMParamBlockPtr params)
  141. {
  142.     PicHandle    pictH;
  143.     Rect    r;
  144.     Rect    screenRect;
  145.     Rect    toRect;
  146.     GWorldPtr    curWorld;
  147.     GWorldPtr    picWorld;
  148.     GDHandle    curDev;
  149.     OSErr        err;
  150.     long        newTime;
  151.     
  152.     FillRgn( blankRgn, ¶ms->qdGlobalsCopy->qdBlack );
  153.  
  154.     pictH = GetPicture( 1000 );
  155.     if ( !pictH )
  156.         return noErr;
  157.     
  158.     r = (*pictH)->picFrame;
  159.  
  160.     err = NewGWorld( &picWorld,
  161.                     1, 
  162.                     &r,
  163.                     (CTabHandle)NULL,
  164.                     (GDHandle)NULL,
  165.                     (GWorldFlags)0 );
  166.     
  167.     if ( err )
  168.         return err;
  169.             
  170.     LockPixels( picWorld->portPixMap );
  171.     
  172.     GetGWorld( &curWorld, &curDev );
  173.     SetGWorld( picWorld, curDev );
  174.     
  175.     DrawPicture( pictH, &r );
  176.     
  177.     InvertRect( &r );
  178.  
  179.     SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
  180.  
  181.     screenRect = params->monitors->monitorList[ 0 ].bounds;
  182.     
  183.     CenterRect( &toRect, &r, &screenRect );
  184.  
  185.     CopyBits( (BitMap*)*( picWorld )->portPixMap,
  186.                 ¶ms->qdGlobalsCopy->qdThePort->portBits,
  187.                 &r, 
  188.                 &toRect,
  189.                 srcCopy, 
  190.                 (RgnHandle)NULL );
  191.  
  192.     ReleaseResource( (Handle)pictH );    
  193.     
  194.     Delay( 60, &newTime );
  195.  
  196.     return noErr;
  197. }
  198.  
  199. void CenterRect( Rect *toPtr, Rect *fromPtr, Rect *inPtr )
  200. {
  201.     short    inWidth;
  202.     short    inHeight;
  203.     
  204.     inWidth = inPtr->right - inPtr->left;
  205.     inHeight = inPtr->bottom - inPtr->top;
  206.     
  207.     toPtr->left = inPtr->left + ( inWidth / 2 ) 
  208.                                 - ( fromPtr->right - fromPtr->left ) / 2;
  209.     toPtr->top = inPtr->top + ( inHeight / 2 )
  210.                                 - ( fromPtr->bottom - fromPtr->top ) / 2;
  211.     
  212.     toPtr->right = toPtr->left + ( fromPtr->right - fromPtr->left );
  213.     toPtr->bottom = toPtr->top + ( fromPtr->bottom - fromPtr->top );
  214.  
  215.     return;
  216. }
  217.  
  218. OSErr DoDrawFrame(Handle storage,RgnHandle blankRgn,GMParamBlockPtr params)
  219. {
  220.     tTwistHandle    tHdl;
  221.     short            curLine;
  222.     GWorldPtr        tempWorld;
  223.     Rect            fromRect;
  224.     Rect            toRect;
  225.     Rect            scrollRect;
  226.     GDHandle        curDev;
  227.     GWorldPtr        curWorld;
  228.     short            i;
  229.     short            j;
  230.  
  231.     tHdl = (tTwistHandle)storage;
  232.  
  233.     GetGWorld( &curWorld, &curDev );
  234.  
  235.     if ( (*tHdl)->firstDraw ){
  236.         (*tHdl)->firstDraw = false;
  237.         
  238.         for ( i = 0; i < kMaxScreens; i++ ){
  239.             if ( (*tHdl)->screenInfo[ i ] ){
  240.                 fromRect = params->monitors->monitorList[ i ].bounds;
  241.         
  242.                 SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
  243.  
  244.                 LockPixels( ((*(*tHdl)->screenInfo[ i ])->oldScreen)->portPixMap );
  245.             
  246.                 CopyBits( (BitMap*)*( (*(*tHdl)->screenInfo[ i ])->oldScreen)->portPixMap,
  247.                             ¶ms->qdGlobalsCopy->qdThePort->portBits,
  248.                             &fromRect, 
  249.                             &fromRect,
  250.                             srcCopy, 
  251.                             (RgnHandle)NULL );
  252.                 
  253.                 DisposeGWorld( (*(*tHdl)->screenInfo[ i ])->oldScreen );
  254.                 (*(*tHdl)->screenInfo[ i ])->oldScreen = (GWorldPtr)NULL;
  255.             }
  256.         }
  257.     }
  258.  
  259. #define kNumLoops    15
  260.  
  261.     for ( i = 0; i < kNumLoops; i++ ){
  262.     
  263.         for ( j = 0; j < params->monitors->monitorCount; j++ ){        
  264.             (*(*tHdl)->screenInfo[ j ])->curLine++;
  265.             if ( ( *(*tHdl)->screenInfo[ j ])->curLine 
  266.                     >= params->monitors->monitorList[ j ].bounds.bottom ){
  267.                 (*(*tHdl)->screenInfo[ j ])->curLine 
  268.                     = params->monitors->monitorList[ j ].bounds.top;
  269.             }
  270.         
  271.             curLine = (*(*tHdl)->screenInfo[ j ])->curLine;
  272.             
  273.             fromRect = params->monitors->monitorList[ j ].bounds;
  274.             toRect = fromRect;
  275.             scrollRect = fromRect;
  276.         
  277.             fromRect.left = fromRect.right - 1;
  278.             fromRect.bottom = curLine;
  279.             
  280.             toRect.right = toRect.left + 1;
  281.             toRect.bottom = curLine;
  282.             
  283.             scrollRect.bottom = curLine;
  284.         
  285.             
  286.             SetGWorld( (*(*tHdl)->screenInfo[ j ])->tempWorld, curDev );
  287.         
  288.             CopyBits( ¶ms->qdGlobalsCopy->qdThePort->portBits,
  289.                         (BitMap*)*( (*(*tHdl)->screenInfo[ j ])->tempWorld)->portPixMap,
  290.                         &fromRect,
  291.                         &toRect, 
  292.                         srcCopy, 
  293.                         (RgnHandle)NULL );
  294.             
  295.             SetGWorld( (GWorldPtr)( params->qdGlobalsCopy->qdThePort ), curDev );
  296.         
  297.             ScrollRect( &scrollRect, 1, 0, (RgnHandle)NULL );
  298.         
  299.             CopyBits( (BitMap*)*( (*(*tHdl)->screenInfo[ j ])->tempWorld)->portPixMap,
  300.                         ¶ms->qdGlobalsCopy->qdThePort->portBits,
  301.                         &toRect, 
  302.                         &toRect,
  303.                         srcCopy, 
  304.                         (RgnHandle)NULL );
  305.         }
  306.     }
  307.  
  308.     return noErr;
  309. }
  310.  
  311. OSErr DoSetUp(RgnHandle blankRgn,short message,GMParamBlockPtr params)
  312. {
  313.     return noErr;
  314. }
  315.  
  316. OSErr DoButton(RgnHandle blankRgn,short message,GMParamBlockPtr params)
  317. {
  318.     AEAddressDesc        creatorDesc;
  319.     AppleEvent    gurlEvt;
  320.     AppleEvent    replyEvt;
  321.     OSType        creator;
  322.     AEDesc        urlDesc;
  323.     StringHandle    urlStr;
  324.     long        len;
  325.     OSErr        err;
  326.     
  327.     err = FindBrowser( &creator );
  328.     
  329.     if ( err ){
  330.         return err;
  331.     }
  332.     
  333.     if ( creator == 'null' ){
  334.         StopAlert( kCannotFindBrowserID, (ModalFilterUPP)NULL );
  335.         return noErr;
  336.     }
  337.     
  338.     err = AECreateDesc( typeApplSignature,
  339.                         (Ptr)&creator,
  340.                         sizeof( creator ),
  341.                         &creatorDesc );
  342.     if ( err )
  343.         return err;
  344.     
  345.     urlStr = (StringHandle)GetResource( 'STR ', 129 );
  346.     if ( !urlStr )
  347.         return resNotFound;
  348.     
  349.     len = GetHandleSize( (Handle)urlStr );
  350.     
  351.     err = AECreateDesc( typeChar,
  352.                         &( (*urlStr)[ 1 ] ),
  353.                         len - 1,
  354.                         &urlDesc );
  355.     if ( err )
  356.         return err;
  357.  
  358.  
  359.     if ( creator == 'MOS!' ){
  360.         // NCSA Mosaic has its own ideas for AE urls
  361.         err = AECreateAppleEvent( 'mos!',
  362.                                     'ourl',
  363.                                     &creatorDesc,
  364.                                     kAutoGenerateReturnID,
  365.                                     kAnyTransactionID,
  366.                                     &gurlEvt );
  367.     }else{
  368.         err = AECreateAppleEvent( 'GURL',
  369.                                     'GURL',
  370.                                     &creatorDesc,
  371.                                     kAutoGenerateReturnID,
  372.                                     kAnyTransactionID,
  373.                                     &gurlEvt );
  374.     }
  375.     if ( err )
  376.         return err;
  377.     
  378.     err = AEDisposeDesc( &creatorDesc );
  379.     if ( err )
  380.         return err;
  381.  
  382.     err = AEPutParamDesc( &gurlEvt,
  383.                             keyDirectObject,
  384.                             &urlDesc );
  385.                             
  386.     if ( err )
  387.         return err;
  388.     
  389.     err = AEDisposeDesc( &urlDesc );
  390.     if ( err )
  391.         return err;
  392.  
  393.     err = AESend( &gurlEvt,
  394.                     &replyEvt,
  395.                     kAEWaitReply + kAECanInteract + kAECanSwitchLayer,
  396.                     kAENormalPriority,
  397.                     300,
  398.                     (AEIdleUPP)NULL,
  399.                     (AEFilterUPP)NULL );
  400.     
  401.     if ( err ){
  402.         return err;
  403.     }
  404.     
  405.     err = AEDisposeDesc( &gurlEvt );
  406.     if ( err )
  407.         return noErr;
  408.     
  409.     err = AEDisposeDesc( &replyEvt );
  410.     if ( err )
  411.         return noErr;
  412.     
  413.     return noErr;
  414. }
  415.  
  416.